package com.gitee.deament.server.core.cli.db.str;

import com.gitee.deament.server.config.SystemConfig;
import com.gitee.deament.server.core.annotation.CliHander;
import com.gitee.deament.server.core.cli.AbstractCli;
import com.gitee.deament.server.core.data.ConnectData;
import com.gitee.deament.server.core.data.DBData;
import com.gitee.deament.server.core.data.datatype.Value;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;

import java.util.Date;
import java.util.List;

/**
 * APPEND key value
 * 可用版本： >= 2.0.0
 * 时间复杂度： 平摊O(1)
 * 如果键 key 已经存在并且它的值是一个字符串， APPEND 命令将把 value 追加到键 key 现有值的末尾。
 *
 * 如果 key 不存在， APPEND 就简单地将键 key 的值设为 value ， 就像执行 SET key value 一样。
 *
 * 返回值
 * 追加 value 之后， 键 key 的值的长度。
 * @author  deament
 */
@CliHander(command = "APPEND")
public class APPENDcli extends AbstractCli {
    @Override
    public void executeCli(ChannelHandlerContext channelHandlerContext, String command) {

        List<String> values = getValues(command);
        if (values.size() != 3) {
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("\"ERR wrong number of arguments for 'APPEND' command\""));
            return;
        }
        String key = values.get(1);
        int db = ConnectData.SELECT_DB_STORAGE.getUseDB(channelHandlerContext.channel().id().asLongText());
        Value<String> stringData = SystemConfig.dbData.getStringData(db, key);
        DBData dbData = SystemConfig.dbData;
       Value<String> newValue=   new Value<String>();
        if (stringData == null) {
            newValue.setValue(values.get(3));
            dbData.setStringData(db, key,newValue );
            channelHandlerContext.channel().writeAndFlush(values.get(3).length()+"");
            return;
        }
        Date date = stringData.getExpirDateTime();
        if ((date.compareTo(new Date())) <= 0) {
            newValue.setValue(values.get(3));
            dbData.setStringData(db, key,newValue );
            channelHandlerContext.channel().writeAndFlush(values.get(3).length()+"");
            return;
        }
        newValue.setValue(stringData.getValue()+values.get(3));
        dbData.setStringData(db, key,  newValue );
        channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame(newValue.getValue().length()+""));
    }
}
